package v1

import (
	"github.com/gogf/gf/v2/frame/g"
	"goAdminV1/utility"
)

// PermissionListReq 权限列表请求结构体
type PermissionListReq struct {
	g.Meta       `path:"/permissions/permissions" method:"get" tags:"权限管理" summary:"获取权限列表"`
	From         string `json:"from" in:"query"`
	Username     string `json:"username" in:"query"`
	Email        string `json:"email" in:"query"`
	Status       int    `json:"status" in:"query"`
	DepartmentId int    `json:"department_id" in:"query"`
	Limit        int    `json:"limit" form:"limit" d:"10" v:"min:10#每页数量不能小于1"`
	Page         int    `json:"page" form:"page" d:"1" v:"min:1#页码为必传参数且不能小于1"`
}

// PermissionListRes 权限列表响应结构体
type PermissionListRes struct {
	utility.PaginatedResponse
}

// Permission 权限结构体，对应数据库表字段
type Permission struct {
	Id             int           `json:"id"`
	Actions        []*Permission `json:"actions"`
	ParentId       int           `json:"parent_id"`
	PermissionName string        `json:"permission_name"`
	Route          string        `json:"route"`
	Icon           string        `json:"icon"`
	Module         string        `json:"module"`
	PermissionMark string        `json:"permission_mark"`
	Component      string        `json:"component"`
	Redirect       *string       `json:"redirect"`
	Keepalive      int           `json:"keepalive"`
	Type           int           `json:"type"`
	Hidden         int           `json:"hidden"`
	ActiveMenu     string        `json:"active_menu"`
	Sort           int           `json:"sort"`
	CreatorId      string        `json:"creator_id"`
	CreatedAt      string        `json:"created_at"`
	UpdatedAt      string        `json:"updated_at"`
	Creator        string        `json:"creator"` // 额外的字段，根据需求从其他地方获取或设置
	Children       []*Permission `json:"children"`
}

// PermissionCreateReq 权限添加请求结构体
type PermissionCreateReq struct {
	g.Meta         `path:"/permissions/permissions" method:"post" tags:"权限管理" summary:"添加权限"`
	Sort           int    `json:"sort" v:"required#排序必填"`
	Keepalive      int    `json:"keepalive" v:"required#keepalive 必填"`
	Type           int    `json:"type" v:"required#权限类型必填，1 为目录，2 为菜单，3 为按钮"`
	Hidden         int    `json:"hidden" v:"required#是否隐藏必填"`
	PermissionName string `json:"permission_name" v:"required#权限名称必填"`
	Module         string `json:"module" v:"required#所属模块必填"`
	Route          string `json:"route" v:"required#前端路由必填"`
	Redirect       string `json:"redirect" v:"required#前端重定向必填"`
	ParentId       int    `json:"parent_id" v:"required#父级Id必填"`
	Icon           string `json:"icon" v:"required#菜单Icon必填"`
	Component      string `json:"component" v:"required#组件路径必填"`
}

// PermissionCreateRes 权限添加响应结构体
type PermissionCreateRes struct {
	Message string `json:"message"`
}

// PermissionDetailReq 权限更新请求结构体
type PermissionDetailReq struct {
	g.Meta `path:"/permissions/permissions/{id}" method:"get" tags:"权限管理" summary:"更新权限"`
	Id     int `json:"id" v:"required#权限Id必填"`
}

// PermissionDetailRes 权限更新响应结构体
type PermissionDetailRes struct {
	Id             int    `json:"id"`
	ParentId       int    `json:"parent_id"`
	PermissionName string `json:"permission_name"`
	Route          string `json:"route"`
	Icon           string `json:"icon"`
	Module         string `json:"module"`
	PermissionMark string `json:"permission_mark"`
	Component      string `json:"component"`
	Redirect       string `json:"redirect"`
	Keepalive      int    `json:"keepalive"`
	Type           int    `json:"type"`
	Hidden         int    `json:"hidden"`
	Sort           int    `json:"sort"`
	ActiveMenu     string `json:"active_menu"`
	CreatorId      int    `json:"creator_id"`
	CreatedAt      string `json:"created_at"`
	UpdatedAt      string `json:"updated_at"`
}

// PermissionUpdateReq 权限更新请求结构体
type PermissionUpdateReq struct {
	g.Meta         `path:"/permissions/permissions/{id}" method:"put" tags:"权限管理" summary:"更新权限"`
	Id             int         `json:"id" v:"required#权限Id必填"`
	Type           int         `json:"type" v:"required#类型必填，1 为目录，2 为菜单，3 为按钮"`
	ParentId       int         `json:"parent_id" v:"required#父级Id必填"`
	PermissionName string      `json:"permission_name" v:"required#菜单名称必填"`
	PermissionMark string      `json:"permission_mark"`
	Icon           string      `json:"icon" v:"required#菜单Icon必填"`
	Module         string      `json:"module"`
	Route          string      `json:"route"`
	Component      string      `json:"component"`
	Redirect       interface{} `json:"redirect"` // 因为可能为null，所以使用interface{}
	Keepalive      int         `json:"keepalive"`
	IsInner        bool        `json:"is_inner"`
	Hidden         int         `json:"hidden"`
	Sort           int         `json:"sort"`
	ActiveMenu     string      `json:"active_menu"`
	CreatorId      int         `json:"creator_id"`
	CreatedAt      string      `json:"created_at"`
	UpdatedAt      string      `json:"updated_at"`
}

// PermissionUpdateRes 权限更新响应结构体
type PermissionUpdateRes struct {
	Message string `json:"message"`
}

// PermissionDeleteReq 权限删除请求结构体
type PermissionDeleteReq struct {
	g.Meta `path:"/permissions/permissions/{id}" method:"delete" tags:"权限管理" summary:"删除权限"`
	Id     int `json:"id" v:"required#权限Id必填"`
}

// PermissionDeleteRes 权限删除响应结构体
type PermissionDeleteRes struct {
	Message string `json:"message"`
}

// DepartmentListReq 部门列表请求结构体
type DepartmentListReq struct {
	g.Meta         `path:"/permissions/departments" method:"get" tags:"部门管理" summary:"获取部门列表"`
	DepartmentName string `json:"department_name" in:"query"`
	Limit          int    `json:"limit" form:"limit" d:"10" v:"min:10#每页数量不能小于1"`
	Page           int    `json:"page" form:"page" d:"1" v:"min:1#页码为必传参数且不能小于1"`
}

// DepartmentListRes 部门列表响应结构体
type DepartmentListRes struct {
	utility.PaginatedResponse
}

// DepartmentListItem 部门列表项结构体
type DepartmentListItem struct {
	Id             int                   `json:"id"`
	DepartmentName string                `json:"department_name"`
	ParentId       string                `json:"parent_id"`
	Sort           int                   `json:"sort"`
	Status         int                   `json:"status"`
	Creator        string                `json:"creator"`
	CreatedAt      string                `json:"created_at"`
	Children       []*DepartmentListItem `json:"children"`
}

// DepartmentCreateReq 部门创建请求结构体
type DepartmentCreateReq struct {
	g.Meta         `path:"/permissions/departments" method:"post" tags:"部门管理" summary:"创建部门"`
	ParentId       string `json:"parent_id" v:"required#父级Id不能为空"`
	DepartmentName string `json:"department_name" v:"required#部门名称不能为空"`
	Principal      string `json:"principal" v:"required#部门联系人不能为空"`
	Email          string `json:"email" v:"required|email#邮箱不能为空且格式要正确"`
	Mobile         string `json:"mobile"`
	Sort           int    `json:"sort"`
}

// DepartmentCreateRes 部门创建响应结构体
type DepartmentCreateRes struct {
	Message string `json:"message"`
}

// DepartmentUpdateReq 部门更新请求结构体
type DepartmentUpdateReq struct {
	g.Meta         `path:"/permissions/departments/{id}" method:"put" tags:"部门管理" summary:"更新部门信息"`
	Id             int    `json:"id" v:"required#部门 Id 不能为空"`
	ParentId       string `json:"parent_id" v:"required#父级 Id 不能为空"`
	DepartmentName string `json:"department_name" v:"required#部门名称不能为空"`
	Principal      string `json:"principal" v:"required#部门联系人不能为空"`
	Email          string `json:"email" v:"required|email#邮箱不能为空且格式要正确"`
	Mobile         string `json:"mobile"`
	Sort           int    `json:"sort"`
}

// DepartmentUpdateRes 部门更新响应结构体
type DepartmentUpdateRes struct {
	Message string `json:"message"`
}

// DepartmentDeleteReq 部门删除请求结构体
type DepartmentDeleteReq struct {
	g.Meta `path:"/permissions/departments/{id}" method:"delete" tags:"部门管理" summary:"删除部门"`
	Id     int `json:"id" v:"required#部门 Id 不能为空"`
}

// DepartmentDeleteRes 部门删除响应结构体
type DepartmentDeleteRes struct {
	Message string `json:"message"`
}

// JobListReq 岗位列表请求结构体
type JobListReq struct {
	g.Meta  `path:"/permissions/jobs" method:"get" tags:"岗位管理" summary:"获取岗位列表"`
	JobName string `json:"job_name" in:"query"`
	Limit   int    `json:"limit" form:"limit" d:"10" v:"min:10#每页数量不能小于1"`
	Page    int    `json:"page" form:"page" d:"1" v:"min:1#页码为必传参数且不能小于1"`
}

// JobListRes 岗位列表响应结构体
type JobListRes struct {
	utility.PaginatedResponse
}

// JobListItem 岗位列表项结构体
type JobListItem struct {
	Id          int    `json:"id"`
	JobName     string `json:"job_name"`
	Coding      string `json:"coding"`
	Description string `json:"description"`
	Sort        int    `json:"sort"`
	Status      int    `json:"status"`
	CreatedAt   string `json:"created_at"`
	UpdatedAt   string `json:"updated_at"`
	Creator     string `json:"creator"`
	CreatorId   string `json:"creator_id"`
}

// JobCreateReq 岗位创建请求结构体
type JobCreateReq struct {
	g.Meta      `path:"/permissions/jobs" method:"post" tags:"岗位管理" summary:"创建岗位"`
	JobName     string `json:"job_name" v:"required#岗位名称不能为空"`
	Coding      string `json:"coding" v:"required#岗位编码不能为空"`
	Description string `json:"description"`
	Sort        int    `json:"sort"`
	Status      int    `json:"status"`
}

// JobCreateRes 岗位创建响应结构体
type JobCreateRes struct {
	Message string `json:"message"`
}

// JobDetailReq 详情请求
type JobDetailReq struct {
	g.Meta `path:"/permissions/jobs/{id}" method:"get" tags:"岗位管理" summary:"获取岗位详情"`
	Id     int `json:"id" `
}

type JobDetailRes struct {
	JobName     string `json:"job_name"`
	Coding      string `json:"coding"`
	Description string `json:"description"`
	Sort        int    `json:"sort"`
	Status      int    `json:"status"`
	CreatedAt   string `json:"created_at"`
	UpdatedAt   string `json:"updated_at"`
	Creator     string `json:"creator"`
}

// JobDisableReq 岗位禁用请求结构体
type JobDisableReq struct {
	g.Meta `path:"/permissions/jobs/enable/{id}" method:"put" tags:"岗位管理" summary:"禁用岗位"`
	Id     int `json:"id" v:"required#岗位 ID 不能为空"`
}

// JobDisableRes 岗位禁用响应结构体
type JobDisableRes struct {
}

// JobUpdateReq 岗位更新请求结构体
type JobUpdateReq struct {
	g.Meta      `path:"/permissions/jobs/{id}" method:"put" tags:"岗位管理" summary:"更新岗位信息"`
	Id          int    `json:"id" v:"required#岗位 Id 不能为空"`
	JobName     string `json:"job_name" v:"required#岗位名称不能为空"`
	Coding      string `json:"coding" v:"required#岗位编码不能为空"`
	Description string `json:"description"`
	Sort        int    `json:"sort"`
	Status      int    `json:"status"`
}

// JobUpdateRes 岗位更新响应结构体
type JobUpdateRes struct {
	Message string `json:"message"`
}

// JobDeleteReq 岗位删除请求结构体
type JobDeleteReq struct {
	g.Meta `path:"/permissions/jobs/{id}" method:"delete" tags:"岗位管理" summary:"删除岗位"`
	ID     int `json:"id" v:"required#岗位 ID 不能为空"`
}

// JobDeleteRes 岗位删除响应结构体
type JobDeleteRes struct {
	Message string `json:"message"`
}
